home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / accrd1 / carddeck.bas < prev    next >
BASIC Source File  |  1995-05-09  |  5KB  |  194 lines

  1. DefInt A-Z
  2.  
  3. Declare Function CardVersion Lib "VBCards.Dll" () As Integer
  4.  
  5. Declare Sub GetCard Lib "VBCards.dll" (ByVal Card As Integer)
  6. Declare Function SameSuit Lib "VBCards.Dll" (ByVal c1 As Integer, ByVal c2 As Integer) As Integer
  7. Declare Function SuitOf Lib "VBCards.DLL" (ByVal C As Integer) As Integer
  8. Declare Function CardValue Lib "vbCards.dll" (ByVal C As Integer)
  9. Declare Function SameCardValue Lib "VBCards.Dll" (ByVal c1 As Integer, ByVal c2 As Integer) As Integer
  10.  
  11. Declare Function GetProfileInt Lib "Kernel" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal nDefault As Integer) As Integer
  12. Declare Function GetProfileString Lib "Kernel" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer) As Integer
  13. Declare Function WriteProfileString Lib "Kernel" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String) As Integer
  14.  
  15. ' This routine deletes the card that has just been moved and
  16. ' moves the cards following it up one.  Then it deletes the
  17. ' last card.  The TABLE array is maintained
  18. Sub Compact (ByVal Source As Integer)
  19.   Piles = Piles - 1
  20.   For i = Source + 1 To Piles
  21.      Form1.Picture1(i - 1).Picture = Form1.Picture1(i).Picture
  22.      Table(i) = Table(i + 1)
  23.   Next i
  24.   Unload Form1.Picture1(Piles)
  25. End Sub
  26.  
  27. ' Calcuate the position of this the next card delt
  28. Function CurrentCol (Pile As Integer) As Integer
  29.   CardWidth = Form1.Picture1(0).Width
  30.   
  31.   ' First calculate the indention
  32.   Level = CurrentLevel(Pile) - 1
  33.   J = Form1.Picture1(0).Left + (Level * CardWidth)
  34.   J = J + (Level * CardSpace)
  35.  
  36.   ' Now calculate the exact card position
  37.   Level = Pile - (4 * Level) - 1
  38.   J = J + (Level * CardSpace) + (Level * CardWidth)
  39.   CurrentCol = J
  40. End Function
  41.  
  42. ' This returns the logical row of the Card% specified
  43. Function CurrentLevel (Pile%) As Integer
  44.   NumRows = Int(Pile% / 4)
  45.   If (NumRows * 4) < Pile% Then
  46.     NumRows = NumRows + 1
  47.   End If
  48.   CurrentLevel = NumRows
  49. End Function
  50.  
  51. ' This returns the actual card position
  52. Function CurrentRow (Pile%) As Integer
  53.   CardHeight = Form1.Picture1(0).Height
  54.   If Compressed Then
  55.     CardHeight = Int(CardHeight / 2)
  56.   End If
  57.   NumRows = CurrentLevel(Pile%) - 1
  58.   
  59.   ' Now calcuate the correct row position
  60.   J = NumRows * CardHeight
  61.   J = J + (NumRows * CardSpace)
  62.   CurrentRow = J + Form1.Picture1(0).Top
  63. End Function
  64.  
  65. Sub Main ()
  66.    Randomize
  67.      
  68.    ' Get the various WIN.INI options
  69.    DisplayError = GetProfileInt(AppName$, "Errors", 0) - 1
  70.    GamesWon = GetProfileInt(AppName$, "Won", 0)
  71.    GamesLost = GetProfileInt(AppName$, "Lost", 0)
  72.    Compressed = GetProfileInt(AppName$, "Compressed", 1) - 1
  73.    
  74.    Form1.Show
  75.    Form1.WindowState = GetProfileInt(AppName$, "WinState", 0)
  76.    
  77.    Do While -1
  78.      Do While DoEvents() And MorePlays()
  79.      Loop
  80.    
  81.      If NextCard = 53 Then
  82.         If Piles = 1 Then
  83.            WonForm.Show 1
  84.            GamesWon = GamesWon + 1
  85.         Else
  86.            Lost.Show 1
  87.            GamesLost = GamesLost + 1
  88.         End If
  89.       
  90.         ' Start New Game!
  91.         NewGame
  92.  
  93.      Else
  94.         Exit Do
  95.      End If
  96.  
  97.    Loop
  98.  
  99.    UpdateIni
  100.    End
  101. End Sub
  102.  
  103. Function MorePlays () As Integer
  104.   ' Only check for more plays if we have no cards left to
  105.   ' deal.
  106.   MorePlays = -1
  107.   If NextCard = 53 Then
  108.     If Piles > 1 Then 'we haven't won yet
  109.       MorePlays = 0
  110.       For i = 2 To Piles
  111.         If ValidMove(i - 1, i - 2) Then 'still more moves
  112.           MorePlays = -1
  113.         Else
  114.            If i > 3 Then
  115.              If ValidMove(i - 1, i - 4) Then 'still more moves
  116.                MorePlays = -1
  117.              End If
  118.            End If
  119.         End If
  120.       Next
  121.     End If
  122.   End If
  123. End Function
  124.  
  125. Sub NewGame ()
  126.    Undone = -1
  127.    Form1.Command1.Enabled = -1
  128.  
  129.    'Clear out old cards first
  130.    For i = 1 To Piles - 1
  131.       Unload Form1.Picture1(i)
  132.    Next
  133.  
  134.    Piles = 1
  135.  
  136.    ShuffleCards
  137.    
  138.    GetCard (cards(1))
  139.    Table(1) = cards(1)
  140.    Form1.Picture1(0).Picture = ClipBoard.GetData(2)
  141.    
  142.    NextCard = 2
  143.  
  144. End Sub
  145.  
  146. Sub ShowError (Msg$)
  147.   If DisplayError Then
  148.     Beep
  149.     MsgBox Msg$, 0, "Sorry!"
  150.   End If
  151. End Sub
  152.  
  153. Sub ShuffleCards ()
  154.    
  155.    For i = 1 To 52
  156.       cards(i) = i
  157.    Next i
  158.  
  159.    For J = 1 To 10
  160.      For i = 1 To 52
  161.         K = Int(52 * Rnd + 1)
  162.         Temp = cards(i)
  163.         cards(i) = cards(K)
  164.         cards(K) = Temp
  165.      Next i
  166.    Next J
  167.  
  168. End Sub
  169.  
  170. Sub UndoSave ()
  171.    Undone = 0
  172.    UndoPiles = Piles
  173.    UndoNextCard = NextCard
  174.    For i = 1 To Piles
  175.       Undoer(i) = Table(i)
  176.    Next
  177. End Sub
  178.  
  179. Sub UpdateIni ()
  180.    ' Write our WIN.INI values
  181.    X = WriteProfileString(AppName$, "Errors", Str$(DisplayError + 1))
  182.    X = WriteProfileString(AppName$, "WinState", Str$(Form1.WindowState))
  183.    X = WriteProfileString(AppName$, "Won", Str$(GamesWon))
  184.    X = WriteProfileString(AppName$, "Lost", Str$(GamesLost))
  185.    X = WriteProfileString(AppName$, "Compressed", Str$(Compressed + 1))
  186. End Sub
  187.  
  188. Function ValidMove (ByVal c1, ByVal c2 As Integer) As Integer
  189.     c1 = Table(c1 + 1)
  190.     c2 = Table(c2 + 1)
  191.     ValidMove = SameSuit(c1, c2) Or SameCardValue(c1, c2)
  192. End Function
  193.  
  194.